package com.pe.pgn.clubpgn.dao.impl;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.PeriodoAcumulacionDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClprPeriodoAcumulacion;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

@Repository("periodoacumulacionDao")
public class PeriodoAcumulacionDaoImpl extends GenericDaoHibernate<ClprPeriodoAcumulacion, Long>  implements PeriodoAcumulacionDao {

	public PeriodoAcumulacionDaoImpl() {
		super(ClprPeriodoAcumulacion.class);
		// TODO Auto-generated constructor stub
	}
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	@Override
	public List<ClprPeriodoAcumulacion> obtenerperiodosacumulacion(
			Long idprograma) {
		
		
		List<ClprPeriodoAcumulacion> lista= null;
		
		StringBuffer query= new StringBuffer();
		
		query.append(" select ");
		query.append(" 	pa.id, ");
		query.append("	to_char(cast(pa.da_fecha_inicio as date), '"+CLPConstantes.DATE_PATTERN+"')  as desfechainicio, ");
		query.append("  to_char(cast(pa.da_fecha_fin as date), '"+CLPConstantes.DATE_PATTERN+"')as desfechafin, ");
		query.append(" 	to_char(cast(pa.da_fecha_vencimiento_puntos as date), '"+CLPConstantes.DATE_PATTERN+"') as desFechaVencimientoPuntos, ");
		query.append(" 	pa.co_programa as coPrograma ");
		query.append(" from clpr_periodo_acumulacion  pa");
		query.append(" where pa.st_periodo_acumulacion='Y' and pa.co_programa=").append(idprograma);
		query.append(" order by pa.da_fecha_inicio asc ");
		
		
		lista=findListOfBeans(query.toString(), null, ClprPeriodoAcumulacion.class);
		

		
		return lista;
	}
	public void saveOrUpdatePeriodoAcumulacion(ClprPeriodoAcumulacion clprPeriodoAcumulacion, ClpbPrograma clpbprograma) {
		
		clprPeriodoAcumulacion.setClpbPrograma(clpbprograma);
		clprPeriodoAcumulacion.setDaFechaInicio(clprPeriodoAcumulacion.getDaFechaInicio());
		clprPeriodoAcumulacion.setDaFechaFin(clprPeriodoAcumulacion.getDaFechaFin());
		clprPeriodoAcumulacion.setDaFechaVencimientoPuntos(clprPeriodoAcumulacion.getDaFechaVencimientoPuntos());
		clprPeriodoAcumulacion.setStPeriodoAcumulacion(true);
		clprPeriodoAcumulacion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
		clprPeriodoAcumulacion.setDaFechaCreacion(Calendar.getInstance());
		
		
		String fechaini=clprPeriodoAcumulacion.getDesFechaInicio();
		String fechafin=clprPeriodoAcumulacion.getDesFechaFin();
		String fechaven=clprPeriodoAcumulacion.getDesFechaVencimientoPuntos();
		StringBuffer query=new StringBuffer();
		query.append(" insert into clpr_periodo_acumulacion(id,da_fecha_inicio,da_fecha_fin,da_fecha_vencimiento_puntos,co_programa,co_usuario_creador,da_fecha_creacion,st_periodo_acumulacion) ");
		query.append(" values(seq_periodo_acumulacion.nextVal,to_date('"+fechaini+"','dd/MM/yyyy')," +
				" to_date('"+fechafin+"','dd/MM/yyyy'), to_date('"+fechaven+"','dd/MM/yyyy')," +
				" "+clpbprograma.getId()+",'"+clprPeriodoAcumulacion.getCoUsuarioCreador()+"' ,sysdate, '"+CLPConstantes.ST_VERDADERO+"') ");
		jdbcTemplate.update(query.toString());

	}
	
	
	
	
	public String validarNoTocarPeriodosExistentes(
		ClprPeriodoAcumulacion periodoprograma, ClpbPrograma clpbprograma) {

		String daFechaInicio = CalendarUtil.calendarToString(
		CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT, periodoprograma.getDaFechaInicio());
		
		String daFechaFin   = CalendarUtil.calendarToString(
		CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT, periodoprograma.getDaFechaFin());
		
		String daFechaVen = CalendarUtil.calendarToString(
				CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT,  periodoprograma.getDaFechaVencimientoPuntos());
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) as conta ");
		query.append(" from clpr_periodo_acumulacion ");
		query.append(" where ");
		query.append(" st_periodo_acumulacion = '"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" and co_programa = ").append(clpbprograma.getId());
		query.append(" and ( ");
		query.append(" (da_fecha_inicio <= to_date('").append(daFechaInicio).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"') ");		
		query.append(" and da_fecha_vencimiento_puntos >= to_date('").append(daFechaVen).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')) ");
		query.append(" 	 or ");
		query.append(" (da_fecha_inicio    >= to_date('").append(daFechaInicio).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"') ");
		query.append(" and da_fecha_inicio <= to_date('").append(daFechaVen).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"') ");
		query.append(" and da_fecha_vencimiento_puntos   >= to_date('").append(daFechaVen).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"'))");
		query.append(" 	 or ");
		query.append(" (da_fecha_inicio <= to_date('").append(daFechaInicio).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"') ");
		query.append(" and da_fecha_vencimiento_puntos >= to_date('").append(daFechaInicio).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"')");
		query.append(" and da_fecha_vencimiento_puntos <= to_date('").append(daFechaVen).append("', '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_SHORT+"'))  )");
		
		int conta = jdbcTemplate.queryForInt(query.toString());
		if(conta > 0){
			//return false; //no es valido
			
			return query.toString();
		}else{
			//return true; // es valido
			return "";
		}
	}
	
	

	
	
	public ClprPeriodoAcumulacion findPeriodoProgramaById(
			Long id) {
		
		ClprPeriodoAcumulacion clprPeriodoAcumulacion = new ClprPeriodoAcumulacion();
		
		DateFormat formatter ; 
		 Date date = new Date(),date1=new Date() ; 
		 
		StringBuffer query= new StringBuffer();
		
		query.append(" select ");
		query.append(" 	pa.id as id, ");
		query.append("	to_char(cast(pa.da_fecha_inicio as date), '"+CLPConstantes.DATE_PATTERN+"')  as desfechainicio, ");
		query.append("  to_char(cast(pa.da_fecha_fin as date), '"+CLPConstantes.DATE_PATTERN+"')as desfechafin, ");
		query.append(" 	to_char(cast(pa.da_fecha_vencimiento_puntos as date), '"+CLPConstantes.DATE_PATTERN+"') as desFechaVencimientoPuntos, ");
		query.append(" 	pa.co_programa as coPrograma ");
		query.append(" from clpr_periodo_acumulacion  pa ");
		query.append(" where pa.st_periodo_acumulacion='Y' and pa.id=? ");
	
		
		
		List<Map<String, Object>> lista= jdbcTemplate.queryForList(query.toString(),id);
		if(!lista.isEmpty()){
			
			Map<String, Object> map = (HashMap<String, Object>)lista.get(0);
			clprPeriodoAcumulacion.setId(new Long(map.get("id").toString()));
			clprPeriodoAcumulacion.setDesFechaInicio(map.get("desfechainicio").toString());
			clprPeriodoAcumulacion.setDesFechaFin(map.get("desFechaFin").toString());
			clprPeriodoAcumulacion.setDesFechaVencimientoPuntos(map.get("desFechaVencimientoPuntos").toString());
			clprPeriodoAcumulacion.setCoPrograma(map.get("coPrograma").toString());
			
		
			 formatter = new SimpleDateFormat("dd/MM/yyyy");
			 try {
				date = (Date)formatter.parse(map.get("desfechainicio").toString());
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			 Calendar cal=Calendar.getInstance(); 
			 cal.setTime(date);
			 
			 try {
				date1 = (Date)formatter.parse(map.get("desFechaVencimientoPuntos").toString());
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			 Calendar cal1=Calendar.getInstance();
			 cal1.setTime(date1);
			
			clprPeriodoAcumulacion.setDaFechaInicio(cal);
			clprPeriodoAcumulacion.setDaFechaVencimientoPuntos(cal1);
		}

	
		return clprPeriodoAcumulacion;
	}
	
	public void eliminarPeriodoAcumulacion(Long id) {
		
		StringBuffer query= new StringBuffer();
		
		query.append(" delete from clpr_periodo_acumulacion ");
		query.append(" where id="+id+" ");
	
		jdbcTemplate.update(query.toString());

	}


}
